﻿// Copyright (c) 2012 Mokah Nnamezie & Andrew Cooper
// Neo4Net graph database - http://neo4net.codeplex.com
//
// This file is part of Neo4Net - a .Net port of the Neo4j graph database
//
// Neo4Net is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

namespace Neo4Net.Helpers.Collection
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using NUnit.Framework;

    [TestFixture]
    class FirstItemEnumerableTest
    {
        [Test]
        public void TestEmptyIterator()
        {
            FirstItemEnumerable<bool> firstItemIterable = new FirstItemEnumerable<bool>(Enumerable.Empty<bool>());
            IEnumerator<bool> empty = firstItemIterable.GetEnumerator();
            Assert.That(empty.MoveNext(), Is.False);
            Assert.That(() => empty.Current, Throws.TypeOf<InvalidOperationException>().With
                                                   .Message.ContainsSubstring("No such element"));
            Assert.That(firstItemIterable.First, Is.Null);
        }

        [Test]
        public void TestSingleIterator()
        {
            FirstItemEnumerable<bool> firstItemIterable = new FirstItemEnumerable<bool>(new[] { true });
            IEnumerator<bool> empty = firstItemIterable.GetEnumerator();
            Assert.That(empty.MoveNext(), Is.True);
            Assert.That(empty.Current, Is.True);
            Assert.That(firstItemIterable.First, Is.True);
            Assert.That(empty.MoveNext(), Is.False);
            Assert.That(() => empty.Current, Throws.TypeOf<InvalidOperationException>().With
                                                   .Message.ContainsSubstring("No such element"));
            Assert.That(firstItemIterable.First, Is.True);
        }

        [Test]
        public void TestMultiIterator()
        {
            FirstItemEnumerable<bool> firstItemIterable = new FirstItemEnumerable<bool>(new[] { true, false });
            IEnumerator<bool> empty = firstItemIterable.GetEnumerator();
            Assert.That(empty.MoveNext(), Is.True);
            Assert.That(empty.Current, Is.True);
            Assert.That(firstItemIterable.First, Is.True);
            Assert.That(empty.MoveNext(), Is.True);
            Assert.That(empty.Current, Is.False);
            Assert.That(firstItemIterable.First, Is.True);
            Assert.That(empty.MoveNext(), Is.False);
            Assert.That(() => empty.Current, Throws.TypeOf<InvalidOperationException>().With
                                                   .Message.ContainsSubstring("No such element"));
            Assert.That(firstItemIterable.First, Is.True);
        }

    }
}
